package bombita.modelo.Municiones;



import org.jdom2.Element;

import bombita.modelo.Interactuador;
import bombita.modelo.Mapa.PosicionFueraDeMapaException;
import bombita.modelo.Mapa.Vector2D;
import bombita.modelo.Obstaculos.NoPasarException;
import bombita.modelo.Personajes.Personaje;

/*El atributo dano tiene la resistencia que va a restar cada tipo
  de bomba en particular, rango  la cantidad de posiciones(en las 4
  posiciones) a las que afecta la bomba, y delay, el tiempo que tarda
  la bomba desde que se plantó hasta que explota.*/
public abstract class Bomba extends Municion
{
	protected int dano;
	protected int rango;
	protected float delay;
	
	public Bomba() {
		dano = 1;
		rango = 1;
		delay = 3.0f;
	}
	
	public float delay() {
		return delay;
	}
	
	public void interactuarCon(Interactuador unaCosa) {
		unaCosa.interactuarConBomba(this);
	}
	
	public void interactuarConPersonaje(Personaje unaCosa) throws NoPasarException{
		throw new NoPasarException();
	}
	
	@Override
	public void recibirPulsoReloj(float tiempo)
	{
		this.delay -= tiempo;
		if (this.delay <= 0){
			this.explotar();
		}
	}
	
	/**/
	protected Explosion prepararExplosion()
	{
		return new ExplosionNormal(this.dano);
	}
	
	/**/
	public void explotar() {
		Vector2D iVersor = new Vector2D(1,0);
		Vector2D jVersor = new Vector2D(0,1);
		
		for (int r = -rango; r <= rango; r++){
			try{
				miPosicion.agregar(this.prepararExplosion(), iVersor.mult(r));
			}catch(PosicionFueraDeMapaException e){}
			
			try{
				miPosicion.agregar(this.prepararExplosion(), jVersor.mult(r));
			}catch(PosicionFueraDeMapaException e){}
		}
		this.destruir();
	}
	
	/*El parametro tiempo lleva el % del tiempo a reducir 	ej: 20%, tiempo = 0.2.*/
	public void bajarRetardo(float tiempo) {
		this.delay = this.delay * (1 - tiempo);
	}

	@Override
	public Element serializar()
	{
		Element nodo = super.serializar();
		nodo.setAttribute("espera", Float.toString(delay));
		return nodo;
	}
	
	@Override
	public void aplicarSerializado(Element nodo) throws Exception {
		super.aplicarSerializado(nodo);
		delay = nodo.getAttribute("espera").getFloatValue();
	}
}
